package com.example.junitdemo.iostream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 文件复制
 */
public class CopyFileDemo {
    public static void main(String[] args) {
        File sourceFile = null;
        File desFile = null;

        String sourceFolder = "D://简要2";
        String copyFolder = "D://copy";

        sourceFile = new File(sourceFolder);

        if (!sourceFile.isDirectory() || !sourceFile.exists()) {
            System.out.println("源文件夹不存在!");
        } else {
            desFile = new File(copyFolder);
            desFile.mkdir();

            copy(sourceFile.listFiles(), desFile);
            System.out.println("文件夹复制成功！");
        }
    }

    /**
     * 创建copy方法，该方法接收文件数组和目标文件夹两个参数，如果目标文件夹不存在，则调用mkdir（）方法创建文件夹，然后再循环中将文件数组
     * 中的每个文件对象写到目标文件夹内。
     *
     * @param fl
     * @param file
     */
    public static void copy(File[] fl, File file) {
        if (!file.exists()) { // 如果文件夹不存在
            file.mkdir(); // 建立新的文件夹
        }

        for (int i = 0; i < fl.length; i++) {
            if (fl[i].isFile()) { // 如果是文件类型，则复制文件
                try {
                    FileInputStream fis = new FileInputStream(fl[i]);
                    FileOutputStream out = new FileOutputStream(new File(
                            file.getPath() + File.separator + fl[i].getName()));

                    int count = fis.available();
                    byte[] data = new byte[count];

                    if ((fis.read(data)) != -1) {
                        out.write(data);
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if (fl[i].isDirectory()) { // 如果是文件夹类型
                File des = new File(file.getPath() + File.separator
                        + fl[i].getName());
                des.mkdir(); // 在目标文件夹中创建相同的文件夹
                copy(fl[i].listFiles(), des); // 递归调用方法本身
            }

        }

    }
}
